package com.zw.a.basic.a14.demo09_tcp_exercise;

//案例: 客户端给服务器端上传文件, 并接收服务器端的回执信息.

import java.io.*;
import java.net.Socket;

//自定义的客户端, 用来读取文本文件中的数据, 然后传输给服务器端, 并接收服务器端的回执信息, 然后打印.
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建客户端的Socket对象.
        Socket socket = new Socket("127.0.0.1", 12345);
        //2. 创建字符高效流, 封装数据源文件.
        BufferedReader br = new BufferedReader(new FileReader("day14/data/1.txt"));
        //3. 通过Socket#getOutputStream()获取输出流, 可以往服务器端写数据,
        //为了写入方便, 将其封装成: 字符高效流.
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //4. 定义变量, 记录读取到的数据.
        String line;
        System.out.println("client: " + 1);
        //5. 循环读取, 只要条件满足, 就一直读, 并将读取到的内容赋值给变量line
        while ((line = br.readLine()) != null) {
            //6. 将读取到的内容写给服务器端.
            bw.write(line);     //问题出自这里, 因为数据是从文件中读取, 然后写给服务器端的,
                                //所以, 这里永远不会给服务器端写 null, 导致服务器端无限接收.
            bw.newLine();
            bw.flush();
        }
        System.out.println("client: " + 2);

        //核心内容, 非常非常重要: 相当于给服务器端写一个结束标记, 告诉服务器端, 我传完了, 你该干嘛干嘛.
        socket.shutdownOutput();

        //7. 获取输入流, 可以读取服务器端写过来的数据.
        BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //8. 读取服务器端写回的回执信息"上传成功", 并打印.
        String data = br2.readLine();
        System.out.println("客户端接收到的服务器反馈信息: " + data);
        System.out.println("client: " + 3);

        //9. 释放资源.
        br.close();
        socket.close();
    }
}
